/*
 This file is part of Subsonic.

 Subsonic is free software: you can redistribute it and/or modify
 it under the terms of the GNU General Public License as published by
 the Free Software Foundation, either version 3 of the License, or
 (at your option) any later version.

 Subsonic is distributed in the hope that it will be useful,
 but WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 GNU General Public License for more details.

 You should have received a copy of the GNU General Public License
 along with Subsonic.  If not, see <http://www.gnu.org/licenses/>.

 Copyright 2009 (C) Sindre Mehus
 */
package net.nullsum.audinaut.domain;

import java.io.Serializable;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Collections;
import java.util.Comparator;
import java.util.Date;
import java.util.List;
import java.util.Locale;

/**
 * @author Sindre Mehus
 */
public class Playlist implements Serializable {

    private String id;
    private String name;
    private String owner;
    private String comment;
    private String songCount;
    private Boolean pub;
    private Date created;
    private Date changed;
    private Integer duration;

    public Playlist() {

    }

    public Playlist(String id, String name) {
        this.id = id;
        this.name = name;
    }

    public Playlist(String id, String name, String owner, String comment, String songCount, String pub, String created, String changed, Integer duration) {
        this.id = id;
        this.name = name;
        this.owner = (owner == null) ? "" : owner;
        this.comment = (comment == null) ? "" : comment;
        this.songCount = (songCount == null) ? "" : songCount;
        this.pub = (pub == null) ? null : (pub.equals("true"));
        setCreated(created);
        setChanged(changed);
        this.duration = duration;
    }

    public String getId() {
        return id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getOwner() {
        return this.owner;
    }

    public String getComment() {
        return this.comment;
    }

    public void setComment(String comment) {
        this.comment = comment;
    }

    public String getSongCount() {
        return this.songCount;
    }

    public void setSongCount(String songCount) {
        this.songCount = songCount;
    }

    public Boolean getPublic() {
        return this.pub;
    }

    public void setPublic(Boolean pub) {
        this.pub = pub;
    }

    public Date getCreated() {
        return created;
    }

    private void setCreated(String created) {
        if (created != null) {
            try {
                this.created = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss", Locale.ENGLISH).parse(created);
            } catch (ParseException e) {
                this.created = null;
            }
        } else {
            this.created = null;
        }
    }

    public Date getChanged() {
        return changed;
    }

    private void setChanged(String changed) {
        if (changed != null) {
            try {
                this.changed = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss", Locale.ENGLISH).parse(changed);
            } catch (ParseException e) {
                this.changed = null;
            }
        } else {
            this.changed = null;
        }
    }

    public Integer getDuration() {
        return duration;
    }

    @Override
    public String toString() {
        return name;
    }

    @Override
    public boolean equals(Object o) {
        if (o == this) {
            return true;
        } else if (o == null) {
            return false;
        } else if (o instanceof String) {
            return o.equals(this.id);
        } else if (o.getClass() != getClass()) {
            return false;
        }

        Playlist playlist = (Playlist) o;
        return playlist.id.equals(this.id);
    }

    public static class PlaylistComparator implements Comparator<Playlist> {
        public static List<Playlist> sort(List<Playlist> playlists) {
            Collections.sort(playlists, new PlaylistComparator());
            return playlists;
        }

        @Override
        public int compare(Playlist playlist1, Playlist playlist2) {
            return playlist1.getName().compareToIgnoreCase(playlist2.getName());
        }
    }
}
